package com.mmall.service.Impl;

import com.mmall.common.Const;
import com.mmall.common.ServerResponse;
import com.mmall.common.TokenCache;
import com.mmall.dao.UserMapper;
import com.mmall.pojo.User;
import com.mmall.service.IUserService;
import com.mmall.util.MD5Util;

import org.apache.commons.lang3.StringUtils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * Created by yanglin on 2019/3/3.
 */
@Service("iUserService")    //IUserService  第一字母小写就可以注入上
public class UserServiceImpl implements IUserService{
    @Autowired
    private UserMapper  userMapper;

    @Override
  public ServerResponse<User> login(String username, String password){
        int resultCount = userMapper.checkUsername(username);
        if(resultCount==0){
            return ServerResponse.createByErrorMessage("用户名不存在");
        }
     // todo 预留一个密码登录，md5
        String pass = MD5Util.MD5EncodeUtf8(password);
      User user = userMapper.selectLogin(username,pass);
      if(user==null){
          return ServerResponse.createByErrorMessage("密码错误");
      }
        user.setPassword(StringUtils.EMPTY);
    return ServerResponse.createBySuccess("登录成功",user);
    }




    public ServerResponse<String > register(User user){
//        int resultCount = userMapper.checkUsername(user.getUsername());
//        if(resultCount>0){
//            return ServerResponse.createByErrorMessage("用户名已存在");
//        }   其功能同下一段

        // 功能复用，复用下面的方法
        ServerResponse validResponse = this.checkValid(user.getUsername(),Const.USERNAME);
        if(!validResponse.isSucess()){
                return validResponse;
        }

        validResponse = this.checkValid(user.getEmail(),Const.EMAIL);
        if(!validResponse.isSucess()){
            return validResponse;
        }



        user.setRole(Const.Role.ROLE_CUSTOMER);
        //md5加密
        user.setPassword(MD5Util.MD5EncodeUtf8(user.getPassword()));
        int resultCount = userMapper.insert(user);
        if(resultCount==0){
            return ServerResponse.createByErrorMessage("注册失败");
        }
        return ServerResponse.createByErrorMessage("注册成功");
    }



     public ServerResponse<String> checkValid(String str,String type){

        if(StringUtils.isNotBlank(type))  //区别 notEmpty  因为前者能够区别出 空格也是空值
        {//开始校验

            if(Const.USERNAME.equals(type)){   //根据type进行判断  传进的值是什么：username  or email
                int resultCount=userMapper.checkUsername(str);
                if(resultCount>0){
                    return ServerResponse.createByErrorMessage("用户名已经存在");
                }

            }
            if(Const.EMAIL.equals(type)){
                int resultCount= userMapper.checkEmail(str);
                if(resultCount>0){
                    return ServerResponse.createByErrorMessage("email已经存在");
                }
            }
        }else{
            return ServerResponse.createByErrorMessage("参数错误");
        }
         return ServerResponse.createBySuccessMessage("校验成功");
     }

    public ServerResponse  selectQuestion(String username){
         ServerResponse validResponse=this.checkValid(username,Const.USERNAME);
        if(validResponse.isSucess()){
          //用户不存在
            return ServerResponse.createByErrorMessage("用户不存在");
        }
        String question = userMapper.selectQuestionByUsername(username);
        if(StringUtils.isNotBlank(question)){
            return ServerResponse.createBySuccess(question);
        }
        return ServerResponse.createByErrorMessage("找回密码的问题是空的");
    }



    public ServerResponse<String> checkAnswer(String username,String question,String answer){
        int resultCount = userMapper.checkAnswer(username,question,answer);
        if(resultCount>0){
            //说明问题及问题答案是这个用户的,并且是正确的
            String forgetToken = UUID.randomUUID().toString();
            TokenCache.setKey(TokenCache.TOKEN_PREFIX+username,forgetToken);
            return ServerResponse.createBySuccess(forgetToken);
        }
        return ServerResponse.createByErrorMessage("问题的答案错误");
    }

  public ServerResponse<String> forgetResetPassword(String username,String passwordNew,String forgetToken){

      if(StringUtils.isBlank(forgetToken)){
          return ServerResponse.createByErrorMessage("参数错误");
      }
      ServerResponse validResponse=this.checkValid(username,Const.USERNAME);
      if(validResponse.isSucess()){
          //用户不存在
          return ServerResponse.createByErrorMessage("用户不存在");
      }
      String token = TokenCache.getKey(TokenCache.TOKEN_PREFIX+username);
      if(StringUtils.isBlank(token)){
          return ServerResponse.createByErrorMessage("token无效");
      }


      if(StringUtils.equals(forgetToken,token)){

          String md5Password=MD5Util.MD5EncodeUtf8(passwordNew);
          int rowCount=userMapper.updatePasswordByUsername(username,md5Password);
          if(rowCount>0)
              return ServerResponse.createBySuccessMessage("密码修改成功");
          else
              return ServerResponse.createByErrorMessage("token错误，请重新获取token");
      }
        return ServerResponse.createByErrorMessage("修改密码失败");
  }



  public ServerResponse<String> resetPassword(String passwordOld,String passwordNew,User user){
      //防止横向越权，要校验一下这个用户的旧密码，一定要指定是这个用户，因为我们会查询到一个count(1),如果不指定id,那么结果就是true啦 count>0
      int resultCount=userMapper.checkPassword(MD5Util.MD5EncodeUtf8(passwordOld),user.getId());
      if(resultCount==0) {
          return ServerResponse.createByErrorMessage("旧密码错误");
      }
      String md5Password = MD5Util.MD5EncodeUtf8(passwordNew);
      user.setPassword(md5Password);
  int updateCount=userMapper.updateByPrimaryKeySelective(user);
      if(updateCount>0){
          return ServerResponse.createBySuccessMessage("密码更新成功");
      }

       return    ServerResponse.createByErrorMessage("密码更新失败");

  }
    public ServerResponse<User> update_information(User user){
        //username 不能被更新
        //email也要进行一个校验，校验新的email是不是已经存在，并且存在email,如果相同的话，不能是我们当前这个用户
    int resultCount = userMapper.checkEmailByUserId(user.getEmail(),user.getId());
        if(resultCount>0){
            return  ServerResponse.createByErrorMessage("email已存在,请更换邮箱");
        }
       // User updateUser =user;  //这个表示全部更新，下面 是有选择的更新

        User updateUser = new User();
        updateUser.setId(user.getId());
        updateUser.setEmail(user.getEmail());
        updateUser.setPhone(user.getPhone());
        updateUser.setQuestion(user.getQuestion());
        updateUser.setAnswer(user.getAnswer());

      int updateCount=  userMapper.updateByPrimaryKeySelective(updateUser);
        if(updateCount>0){
            return ServerResponse.createBySuccessMessage("更新个人信息成功");
        }
        return ServerResponse.createByErrorMessage("跟新个人信息失败");
    }

    public ServerResponse<User> getInformation(Integer userId){
        User user= userMapper.selectByPrimaryKey(userId);
        if(user==null){
            return ServerResponse.createByErrorMessage("找不到当前用户");
        }
        user.setPassword(StringUtils.EMPTY);
        return ServerResponse.createBySuccess(user);
    }


}
